/**
* @author Lourdes Sanchez
* @author Eugenia Jose
* @author Esteban Castro
* @author Carlos Fernandez
* @author Fernando Turon
* @version 1.0 01-05-12
*
* La clase GestorRonda se instancia en distintas parte de la aplicación
*
* @see Ronda
*/

package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Prueba;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.exception.RondaNoExisteException;
import edu.uoc.tds.pec4.model.Ronda;
import edu.uoc.tds.pec4.model.TipoRonda;
import edu.uoc.tds.pec4.model.Usuario;
import java.rmi.RemoteException;
import java.util.Date;

/**
 *
 * @author Fernando
 */
public class GestorRonda {
    //Atributo para almacenar el remoto
    RemotoInterface remoto;
    String schema;

    //Fernando
    //Constructor de clase que recibe por arametro el remoto al que se refiere
    public GestorRonda(RemotoInterface remoto) throws RemoteException{
        this.remoto = remoto;
        this.schema = this.remoto.getSchema();
    }

    //Fernando
    /**
     * Metodo para obtener una lista de instancias de Ronda
     * {pre: es un metodo tipico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public List<Ronda> getListaRondas(int id_prueba) throws RemoteException{
	//Establecemos la sentencia para obtener una lista de resultados
        List<Ronda> lista = new ArrayList<Ronda>();

	//Sentencia SQL
        String sqlString = null;
	sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "WHERE "
                + "id_prueba = ? "
                + "ORDER BY "
                + "id_prueba;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{            
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, id_prueba);
            
            resultSet = preparedStatement.executeQuery();
            
            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el metodo
            while(resultSet.next()){
                Ronda ronda = new Ronda();
                
                ronda.setId_prueba(resultSet.getInt("id_prueba"));
		ronda.setId_tipo_ronda(resultSet.getInt("id_tipo_ronda"));

                lista.add(ronda);
            }
        }
        
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvemos la lista generada
        return lista;
    }

    //Esteban
    /**
     * Metodo para obtener una lista de instancias de Rondas en realización
     * {pre: es un metodo tipico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public List<Ronda> getListaRondasEnRealizacion() throws RemoteException{
	//Establecemos la sentencia para obtener una lista de resultados
        List<Ronda> lista = new ArrayList<Ronda>();

	//Sentencia SQL
        String sqlString = null;
	sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "WHERE "
                + "(fecha_inicio_realizacion <= ? "
                + "AND fecha_fin_realizacion >= ? ) "
                + "ORDER BY "
                + "id_prueba;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setDate(1, new java.sql.Date(new Date().getTime()));
            preparedStatement.setDate(2, new java.sql.Date(new Date().getTime()));

            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el metodo
            while(resultSet.next()){
                Ronda ronda = new Ronda();

                ronda.setId_prueba(resultSet.getInt("id_prueba"));
		ronda.setId_tipo_ronda(resultSet.getInt("id_tipo_ronda"));
                ronda.setId_responsable_cierre(resultSet.getInt("id_responsable_cierre"));
                ronda.setNumero_preguntas(resultSet.getInt("numero_preguntas"));
                ronda.setFecha_inicio_realizacion(resultSet.getDate("fecha_inicio_realizacion"));
                ronda.setFecha_fin_realizacion(resultSet.getDate("fecha_fin_realizacion"));
                ronda.setRespuestas(resultSet.getString("respuestas"));     
                ronda.setFecha_alta(resultSet.getDate("fecha_alta"));
                ronda.setFecha_modificacion(resultSet.getDate("fecha_modificacion"));
                ronda.setFecha_baja(resultSet.getDate("fecha_baja"));

                lista.add(ronda);
            }
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvemos la lista generada
        return lista;
    }


    //Fernando
    /**
     * Metodo para obtener una lista de instancias de Ronda
     * {pre: es un metodo tipico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public List<Ronda> getListaRondas() throws RemoteException{
	//Establecemos la sentencia para obtener una lista de resultados
        List<Ronda> lista = new ArrayList<Ronda>();

	String sqlString = null;
	sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "ORDER BY "
                + "id_prueba;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);

            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el metodo
            while(resultSet.next()){
                Ronda ronda = new Ronda();

                ronda.setId_prueba(resultSet.getInt("id_prueba"));
		ronda.setId_tipo_ronda(resultSet.getInt("id_tipo_ronda"));

                lista.add(ronda);
            }
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvemos la lista generada
        return lista;
    }

    //Fernando
    /**
     * Metodo para obtener la ronda asociada a una prueba y a un tipo de ronda que se pasan por parametro de instancias de Ronda
     */
    public Ronda getRonda(Prueba prueba, TipoRonda tipoRonda) throws RemoteException{
        //Instanciamos la variable Ronda
        Ronda ronda = new Ronda();

        //Establecemos la sentencia para obtener los registros de la tabla Ronda par la pruea y tipo de ronda pasados por parametro
	String sqlString = null;
	sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "WHERE "
                + "id_prueba = ? "
                + "AND "
                + "id_tipo_ronda = ?;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, prueba.getId_prueba());
            preparedStatement.setInt(2, tipoRonda.valor());

            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia de Ronda correspondiente que devolvera el metodo
            if(resultSet.next()){
                ronda.setId_prueba(resultSet.getInt("id_prueba"));
		ronda.setId_tipo_ronda(resultSet.getInt("id_tipo_ronda"));
                ronda.setId_responsable_cierre(resultSet.getInt("id_responsable_cierre"));
                ronda.setNumero_preguntas(resultSet.getInt("numero_preguntas"));
                ronda.setFecha_inicio_realizacion(resultSet.getDate("fecha_inicio_realizacion"));
                ronda.setFecha_fin_realizacion(resultSet.getDate("fecha_fin_realizacion"));
                ronda.setRespuestas(resultSet.getString("respuestas"));                
                ronda.setFecha_alta(resultSet.getDate("fecha_alta"));
                ronda.setFecha_modificacion(resultSet.getDate("fecha_modificacion"));
                ronda.setFecha_baja(resultSet.getDate("fecha_baja"));
            }
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerraremos las estructuras abiertas
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepción de carácter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvermos la instancia de ronda para ese parametro y tipo de ronda
        return ronda;
    }

   //Fernando 
   //Metodo para devolver si se valida una ronda
    public boolean ValidarRonda(Ronda ronda) throws RemoteException{
        boolean esValido = true;

        //Definimos las variables para almacenar el numero minimo y maximo de preguntas
        int numeroPreguntasMaximo;
        int numeroPreguntasMinimo;
        GestorParametro gestorParametro = new GestorParametro();
        numeroPreguntasMaximo = gestorParametro.getNumeroPreguntasMaximas();
        numeroPreguntasMinimo = gestorParametro.getNumeroPreguntasMinimas();

        try{
            //ComprobandoNoNulos
            if(ronda.getNumero_preguntas()==0){
                esValido = false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorPreguntas"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            if(ronda.getNumero_preguntas() > numeroPreguntasMaximo){
                esValido=false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorPreguntasMaximo"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            if(ronda.getNumero_preguntas() < numeroPreguntasMinimo){
                esValido=false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorPreguntasMinimo"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            if(ronda.getFecha_inicio_realizacion()==null){
                esValido=false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorFechaInicializacion"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            if(ronda.getFecha_fin_realizacion()==null){
                esValido=false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorFechaFinalizacion"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            if(ronda.getFecha_fin_realizacion().compareTo(ronda.getFecha_inicio_realizacion())<0){
                esValido=false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorFechaInicializacionYFinalizacion"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            if(ronda.getFecha_alta().compareTo(ronda.getFecha_inicio_realizacion())>0){
                esValido=false;
                JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorFechaInicializacionEInscripcion"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            }

            //Validamos que en la ronda se han introducido todas las respuestas
            String respuestas;
            respuestas = ronda.getRespuestas();
            char cadenaRespuestas[];
            cadenaRespuestas = respuestas.toCharArray();

            for(int i=0; i<cadenaRespuestas.length; i++){
                if(cadenaRespuestas[i]=='0'){
                    esValido= false;
                    JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorRespuestas"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);

                    //Salimos del bucle, ya que de lo contrario nos mostraría una ventana cada vez que una respuesta fuera incompleta
                    i = cadenaRespuestas.length;
                }
            }
        }
        
        //Capturamos la excepcion
        catch(Exception exc){
            esValido = false;
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorprueba.errornosepuedevalidar"), GestorIdiomas.getMessage("gestorprueba.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorprueba.errornosepuedevalidar"));
        }

        finally{
            //Devolvemos un boolano que indica si ha sido validado o no
            return esValido;
        }
    }

    //Fernando
    //Metodo para insetar una ronda
    public void insertarRonda(Ronda ronda) throws RemoteException{
        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "INSERT INTO "
                + this.schema + "."
                + "Ronda "
                + "(id_prueba"
                + ",id_tipo_ronda"
                + ",fecha_alta"
                + ",numero_preguntas)"
                + " VALUES(?,?,?,?);";

        Prueba prueba;
        PreparedStatement preparedStatement = null;

	//Capturaremos la excepcion en caso de error
        try{
            prueba = this.remoto.getPrueba(ronda.getId_prueba());
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, prueba.getId_prueba());
            preparedStatement.setInt(2, ronda.getId_tipo_ronda());
            Date fecha = new Date();
            preparedStatement.setDate(3, new java.sql.Date(fecha.getTime()));

            //A partir del maestro de parametros determinamos el núnmero maximo de preguntas
            int numeroPreguntas = 0;
            GestorParametro gestorParametro = new GestorParametro();
            numeroPreguntas = gestorParametro.getNumeroPreguntasMaximas();
            preparedStatement.setInt(4, numeroPreguntas);

            //Ejecutamos la consulta
            preparedStatement.executeUpdate();
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }
        
        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }
    }

    //Fernando
    //Método para actualiza la informacion de una ronda a partir de los parametros que se pasan del tipo Ronda    
    public void actualizarRonda(Ronda ronda) throws RemoteException{
        //Establecemos la sentencia para actualizar la actualizacion de Ronda
	String sqlString = null;
	sqlString = "UPDATE "
                + this.schema + "."
                + "Ronda "
                + "SET "
                + "numero_preguntas = ?, "
                + "fecha_inicio_realizacion = ?, "
                + "fecha_fin_realizacion = ?, "
                + "fecha_modificacion = ?, "
                + "respuestas = ? "
                + "WHERE "
                + "id_prueba = ? "
                + "AND "
                + "id_tipo_ronda = ?;";

        PreparedStatement preparedStatement = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, ronda.getNumero_preguntas());
            preparedStatement.setDate(2, new java.sql.Date(ronda.getFecha_inicio_realizacion().getTime()));
            preparedStatement.setDate(3, new java.sql.Date(ronda.getFecha_fin_realizacion().getTime()));
            Date fecha = new Date();
            preparedStatement.setDate(4, new java.sql.Date(fecha.getTime()));
            preparedStatement.setString(5, ronda.getRespuestas());
            preparedStatement.setInt(6, ronda.getId_prueba());
            preparedStatement.setInt(7, ronda.getId_tipo_ronda());
            preparedStatement.executeUpdate();
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }
        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cedrramos todas als estructuras que queden abiertas
            try {
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }
    }

    //Fernando
    //Método para actualiza la informacion de una ronda a partir de los parametros que se pasan del tipo Ronda
    // se actualiza el responsable de cierre y la fecha de cierre
    public void cerrarRonda(Prueba prueba, TipoRonda tipoRonda, Usuario usuario) throws RemoteException{
        //Establecemos la sentencia para realizar la actualizaion
	String sqlString = null;
	sqlString = "UPDATE "
                + this.schema + "."
                + "Ronda "
                + "SET "
                + "id_responsable_cierre = ? "
                + "WHERE "
                + "id_prueba = ? "
                + "AND "
                + "id_tipo_ronda = ?;";

        PreparedStatement preparedStatement = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, usuario.getId_usuario());
            preparedStatement.setInt(2, prueba.getId_prueba());
            preparedStatement.setInt(3, tipoRonda.valor());

            preparedStatement.executeUpdate();
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }
        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cedrramos todas als estructuras que queden abiertas
            try {
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }
    }

    //Fernando
    //Metodo que devuelve un booleano indicando la existencia de una ronda pasando por parámetro de tipo de Prueba y TipoRonda
    public boolean existeRonda(Prueba prueba, TipoRonda tipoRonda) throws RemoteException{
        try{
            //Declaramos e instanciamos variables
            boolean existeRonda = false;
            Ronda ronda = new Ronda(prueba, tipoRonda);
            existeRonda = this.verificaExistenciaRonda(ronda);

            //Devolvemos un booleano que indica la existenia o no de la ronda pasada por parametro
            return existeRonda;
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }
    }

    //Fernando
    //Metodo que devuelve un booleano indicando la existencia de una ronda pasando por parametro un tipo Ronda
    public boolean existeRonda(Ronda ronda) throws RemoteException{
        try{
            boolean existeRonda = false;
            existeRonda = this.verificaExistenciaRonda(ronda);

            //Devolveemos un booleano indicando la existencia o no de la ronda pasada por parametro
            return existeRonda;
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }
    }

    //Fernando
    //Metodo que devuelve un booleano que verifica la existencia de una ronda pasada por parámetro    
    private boolean verificaExistenciaRonda(Ronda ronda) throws RemoteException{
        boolean existeRonda = false;

        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "SELECT * "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "WHERE "
                + "id_prueba = ? "
                + "AND "
                + "id_tipo_ronda = ?";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, ronda.getId_prueba());
            preparedStatement.setInt(2, ronda.getId_tipo_ronda());
            resultSet = preparedStatement.executeQuery();

            if(resultSet.next()){
                existeRonda = true;
            }
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }
        
        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos las estructuras abiertas
            try {
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvemos el boolenao indicando la existencia de la ronda
        return existeRonda;
    }

    //Fernando
    //Metodo que devuelve una fecha que indica la realizacion de una ronda pasando por parametro una prueba y un tipo ronda
    
    public Date getFechaInicioRealizacionRonda(Prueba prueba, TipoRonda tipoRonda) throws RemoteException{
        Date fechaInicioRealizacionRonda = null;

        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "SELECT fecha_inicio_realizacion "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "WHERE "
                + "id_prueba = ? "
                + "AND "
                + "id_tipo_ronda = ?";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, prueba.getId_prueba());
            preparedStatement.setInt(2, tipoRonda.valor());
            resultSet = preparedStatement.executeQuery();

            //Si no existe lanzamos una exepcion
            if(!resultSet.next())
                throw new RondaNoExisteException();
            
            //establecemos el valor de la fecha de realizacion a partir de la fecha recuperada en la BBDD
            fechaInicioRealizacionRonda = resultSet.getDate("fecha_inicio_realizacion");
        }

        /** Capturamos el error en el caso en que la lista generada este vacia */
        catch(RondaNoExisteException exc){
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.listaVacia.text"));
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }
        
        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramoxs todos las estructuras abiertas
            try {
                resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvemos la fecha de inicio de la realizacion de la ronda
        return fechaInicioRealizacionRonda;
    }

    //Fernando
    //Metodo que devuelve una cadena con la solucion a las preguntas de una ronda pasada por parametro en forma de prueba y tipo de prueba
    public String getRespuestasSolucion(Prueba prueba, TipoRonda tipoRonda) throws RemoteException{
        String respuestasSolucion = null;

        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "SELECT "
                + "respuestas "
                + "FROM "
                + this.schema + "."
                + "Ronda "
                + "WHERE "
                + "id_prueba = ? "
                + "AND "
                + "id_tipo_ronda = ?";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, prueba.getId_prueba());
            preparedStatement.setInt(2, tipoRonda.valor());
            resultSet = preparedStatement.executeQuery();

            //Si hay error lanzamos una excepcion
            if(!resultSet.next())
                throw new RondaNoExisteException();

            //En otro caso asiganmos la cadena de respuestas
            respuestasSolucion = resultSet.getString("respuestas");
        }

        /** Capturamos el error en el caso en que la lista generada este vacia */
        catch(RondaNoExisteException exc){
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.listaVacia.text"));
        }

        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            exc.printStackTrace();
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.errorBBDD"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.errorBBDD"));
        }

        /** Capturamos excepcion de caracter general*/
        catch (Exception exc) {
            exc.printStackTrace();
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
            throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
        }

        /** En todo caso ejecutamos el siguiente codigo*/
        finally {
            //Cerramos todas las estructuras abiertas
            try {
                resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepcion de caracter general*/
            catch (Exception exc) {
                exc.printStackTrace();
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("gestorronda.error"), GestorIdiomas.getMessage("gestorronda.errorTitulo"), JOptionPane.ERROR_MESSAGE);
                throw new RemoteException(GestorIdiomas.getMessage("gestorronda.error"));
            }
        }

        //Devolvemos la cadena de respuestas aportadas como solucion
        return respuestasSolucion;
    }

    //Fernando
    //Metodo que devuelve el texto descriptivo de una ronda pasando por parametro el eidentificador de la misma    
    public String getDescripcionTipoRonda(int id_tipo_ronda){
        TipoRonda tipoRonda[] = TipoRonda.values();
        return tipoRonda[id_tipo_ronda].toString();
    }
}
